package br.com.jvet.entidade;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.jvet.constante.StatusAgendamento;
import br.com.jvet.constante.TipoServico;

@Entity
@Table(name = "tbagendamento")
@SequenceGenerator(name = "agendamento_seq", sequenceName = "agendamento_seq", initialValue = 1, allocationSize = 1)
public class Agendamento implements Serializable {

	private static final long serialVersionUID = -2419281210072855211L;
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "agendamento_seq")
	private int codigo;
	@Column
	@Enumerated(EnumType.ORDINAL)
	private TipoServico tipoAgendamento;
	@OneToOne
	private Animal animal;
	@OneToOne
	private Cliente cliente;
	@OneToOne
	private Usuario usuario;
	@Column
	@Temporal(TemporalType.DATE)
	private Date dataCadastro;
	@Column
	@Temporal(TemporalType.TIME)
	private Date horaCadastro;
	@Column
	@Temporal(TemporalType.TIME)
	private Date horaMarcada;
	@Column
	@Temporal(TemporalType.DATE)
	private Date dataMarcada;
	@OneToOne(mappedBy = "agendamento", optional = true, cascade = CascadeType.ALL)
	@JoinColumn(name = "codmarcacaoconsulta", referencedColumnName = "codigo", nullable = true)
	private MarcacaoConsulta marcacaoConsulta;
	@Column
	@Enumerated(EnumType.ORDINAL)
	private StatusAgendamento statusAgendamento;
	@Column(length = 200)
	private String observacao;
	@OneToOne(mappedBy = "agendamento", optional = true, cascade = CascadeType.ALL)
	@JoinColumn(name = "codmarcacaoexame", referencedColumnName = "codigo", nullable = true)
	private MarcacaoExame marcacaoExame;
	@OneToOne
	private Funcionario funcionario;

	public Agendamento() {
		super();

		inicializar();

	}

	public void inicializar() {

		dataCadastro = new Date();
		horaCadastro = new Date();
		dataMarcada = new Date();
		animal = new Animal();
		usuario = new Usuario();
		cliente = new Cliente();
		funcionario = new Funcionario();
		marcacaoExame = new MarcacaoExame();
		marcacaoConsulta = new MarcacaoConsulta();
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public TipoServico getTipoAgendamento() {
		return tipoAgendamento;
	}

	public void setTipoAgendamento(TipoServico tipoAgendamento) {
		this.tipoAgendamento = tipoAgendamento;
	}

	public Animal getAnimal() {
		return animal;
	}

	public void setAnimal(Animal animal) {
		this.animal = animal;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Date getHoraCadastro() {
		return horaCadastro;
	}

	public void setHoraCadastro(Date horaCadastro) {
		this.horaCadastro = horaCadastro;
	}

	public Date getHoraMarcada() {
		return horaMarcada;
	}

	public void setHoraMarcada(Date horaMarcada) {
		this.horaMarcada = horaMarcada;
	}

	public Date getDataMarcada() {
		return dataMarcada;
	}

	public void setDataMarcada(Date dataMarcada) {
		this.dataMarcada = dataMarcada;
	}

	public StatusAgendamento getStatusAgendamento() {
		return statusAgendamento;
	}

	public void setStatusAgendamento(StatusAgendamento statusAgendamento) {
		this.statusAgendamento = statusAgendamento;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public MarcacaoConsulta getMarcacaoConsulta() {
		return marcacaoConsulta;
	}

	public void setMarcacaoConsulta(MarcacaoConsulta marcacaoConsulta) {
		this.marcacaoConsulta = marcacaoConsulta;
	}

	public MarcacaoExame getMarcacaoExame() {
		return marcacaoExame;
	}

	public void setMarcacaoExame(MarcacaoExame marcacaoExame) {
		this.marcacaoExame = marcacaoExame;
	}

	@Override
	public String toString() {
		return "Agendamento [codigo=" + codigo + ", tipoAgendamento="
				+ tipoAgendamento + ", animal=" + animal + ", cliente="
				+ cliente + ", usuario=" + usuario + ", dataCadastro="
				+ dataCadastro + ", horaCadastro=" + horaCadastro
				+ ", horaMarcada=" + horaMarcada + ", dataMarcada="
				+ dataMarcada + ", marcacaoConsulta=" + marcacaoConsulta
				+ ", statusAgendamento=" + statusAgendamento + ", observacao="
				+ observacao + ", marcacaoExame=" + marcacaoExame
				+ ", funcionario=" + funcionario + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Agendamento other = (Agendamento) obj;
		if (codigo != other.codigo)
			return false;
		return true;
	}

	public Agendamento clone() {
		Agendamento ag = new Agendamento();
		ag.setAnimal(animal);
		ag.setCliente(cliente);
		ag.setCodigo(codigo);
		ag.setDataCadastro(dataCadastro);
		ag.setDataMarcada(dataMarcada);
		ag.setFuncionario(funcionario);
		ag.setHoraCadastro(horaCadastro);
		ag.setHoraMarcada(horaMarcada);
		ag.setObservacao(observacao);
		ag.setStatusAgendamento(statusAgendamento);
		ag.setTipoAgendamento(tipoAgendamento);
		ag.setUsuario(usuario);
		ag.setMarcacaoConsulta(marcacaoConsulta);
		ag.setMarcacaoExame(marcacaoExame);

		return ag;
	}
}
